#include <iostream>
#include <cstring>
using namespace std;

/*
	默认的拷贝构造函数存在bug：引入什么是浅拷贝
	1.看现象
	  我修改c1的姓名，c2也跟着被修改
	2.bug产生的前题条件
	  属性当中用到了指针，申请了堆空间
	  
*/

class Cat
{
public:
	//定义猫类的构造函数
	Cat(const char *_name,int _age)
	{
		//name申请堆空间
		name=new char[20];
		strcpy(name,_name);
		age=_age;
		cout<<"猫的构造函数"<<endl;
	}
	
	//修改猫的属性
	void setAttr(const char *newname,int newage)
	{
		strcpy(name,newname);
		age=newage;
	}
	
	void show()
	{
		cout<<"name : "<<name<<"  age is: "<<age<<endl;
		cout<<"name 地址: "<<(int *)name<<endl;
		cout<<"age 地址: "<<&age<<endl;
	}

private:
	int age;
	char *name;
};

int main(int argc,char **argv)
{
	Cat c1("来福",5);
	//调用系统默认提供的拷贝构造
	/*
		//this就是c2  other就是c1
		Cat(const Cat &other)
		{
			//此时name是指针，不是string的对象
			this->name=other.name;  //两个name指向同一个地址
			this->age=other.age;
		}
	*/
	Cat c2=c1;  
	              
	//验证结果
	c1.show();
	c2.show();
	
	cout<<"==============修改之后=============="<<endl;
	//打算修改c1的属性--》按道理来说，跟c2无关
	c1.setAttr("莱宝",6);
	c1.show();
	c2.show();

	return 0;	
}